#ifndef AVL_H
#define AVL_H

#include "Arbol.h"
#include "NodoAVL.h"
#include "Puntero.h"
#include "Comparador.h"

template <class T>
class AVL: public Arbol<T>
{
public:

	 
 
	AVL(const Puntero<Comparador<T>> comparador);

	AVL(  Iterador<T> it,const Puntero<Comparador<T>> comparador);

	void Insertar(const T &x);

	bool EsVacio() const; 

	const T& Raiz() const;
	
	const T& Maximo() const;

	const T& Minimo() const;

	bool Existe(const T &x) const; 

	void Borrar(const T &x);

	void BorrarTodo();

	const T& Recuperar(const T&) const;

	Iterador<T> ObtenerIterador() const;

	Puntero<Arbol<T>> Clonar() const;

private:

	Puntero<NodoAVL<T>> raiz;
	const Puntero<Comparador<T>> comparadorClave;
	bool varioH;
	int tamanio;

	
	Puntero<NodoAVL<T>> crearNodoAVL(const T &dato);	
	 
int Altura(Puntero<NodoAVL<T>> nodo) const;
 
	Puntero<NodoAVL<T>> insertarEnAVL(const T &dato, Puntero<NodoAVL<T>> &nodoAVL);
	const T& obtenerMaximo(const Puntero<NodoAVL<T>> &nodo) const;
	const T& obtenerMinimo(const Puntero<NodoAVL<T>> &nodo) const;
	bool existeDato(const T &dato, const Puntero<NodoAVL<T>> &nodo) const;
	const T& recuperarDato(const T &dato, const Puntero<NodoAVL<T>> &nodo) const;
	bool borrarEnAVL(const T &dato, Puntero<NodoAVL<T>> &nodo);
	void rotacionSimpleDer(Puntero<NodoAVL<T>> &nodo);
	void rotacionSimpleIzq(Puntero<NodoAVL<T>> &nodo);
	void rotacionDobleDer(Puntero<NodoAVL<T>> &nodo);
	void rotacionDobleIzq(Puntero<NodoAVL<T>> &nodo);
	void BorrarTodoElArbol(Puntero<NodoAVL<T>> &nodo);
};
#include "AVL.cpp"

#endif